home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Misc / TecLisMailSys / MailScan.c < prev    next >
C/C++ Source or Header  |  1996-06-25  |  15KB  |  536 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <exec/types.h>
  7. #include <exec/memory.h>
  8.  
  9. #include <clib/dos_protos.h>
  10. #include <clib/exec_protos.h>
  11. #include <clib/alib_protos.h>
  12.  
  13. #include <HBBS/ANSI_Codes.h>
  14. #include <HBBS/Defines.h>
  15. #include <HBBS/types.h>
  16. #include <HBBS/structures.h>
  17. #include <HBBS/hbbscommon_protos.h>
  18. #include <HBBS/hbbscommon_pragmas.h>
  19. #include <HBBS/Hbbsnode_protos.h>
  20. #include <HBBS/Hbbsnode_pragmas.h>
  21.  
  22. #include "maildoor.h"
  23. #include "mailscan.h"
  24. #include "mailread.h"
  25.  
  26. BOOL MAILSCAN_CheckConfIsValid( int confnum )
  27. {
  28.   struct ConfData *tmpconf;
  29.  
  30.   if (confnum>0 && confnum<=BBSGlobal->Conferences)
  31.   {
  32.     tmpconf=(struct ConfData *)GetNode(BBSGlobal->ConfList,confnum-1);
  33.  
  34.     if (tmpconf->ConfAccess>N_ND->User.CallData.Access)
  35.       return(FALSE);
  36.     else
  37.       return(TRUE);
  38.   }
  39.   return( FALSE );
  40. }
  41.  
  42. BOOL MAILSCAN_RequestStringFromFile( char *filename, char *buffer, int OffSet )
  43. {
  44.   struct CfgFileData *CfgFile;
  45.   char *NewBuffer = NULL;
  46.  
  47.   MessageBaseError=0;
  48.  
  49.   if(CfgFile=HBBS_LoadConfig( filename ) )
  50.   {
  51.     switch( OffSet )
  52.     {
  53.       case MailSys_OFFSET_FirstMessage:
  54.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "First", OPT_SINGLE );
  55.         strcpy( buffer, NewBuffer );
  56.         break;
  57.       case MailSys_OFFSET_LastMessage:
  58.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "Last", OPT_SINGLE );
  59.         strcpy( buffer, NewBuffer );
  60.         break;
  61.       case MailSys_OFFSET_MessageFrom:
  62.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "From", OPT_SINGLE );
  63.         strcpy( buffer, NewBuffer );
  64.         break;
  65.       case MailSys_OFFSET_MessageFor:
  66.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "For", OPT_SINGLE );
  67.         strcpy( buffer, NewBuffer );
  68.         break;
  69.       case MailSys_OFFSET_MessageForIDs:
  70.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "ForIDs", OPT_SINGLE );
  71.         strcpy( buffer, NewBuffer );
  72.         break;
  73.       case MailSys_OFFSET_MessageSubject:
  74.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "Subject", OPT_SINGLE );
  75.         strcpy( buffer, NewBuffer );
  76.         break;
  77.       case MailSys_OFFSET_MessageRead:
  78.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "Read", OPT_SINGLE );
  79.         strcpy( buffer, NewBuffer );
  80.         break;
  81.       case MailSys_OFFSET_MessageDownLoaded:
  82.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "Downloaded", OPT_SINGLE );
  83.         strcpy( buffer, NewBuffer );
  84.         break;
  85.       case MailSys_OFFSET_MessageFilesDL:
  86.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "FilesDL", OPT_SINGLE );
  87.         strcpy( buffer, NewBuffer );
  88.         break;
  89.       case MailSys_OFFSET_MessageNAttachedFiles:
  90.         HBBS_GetSetting( CfgFile, (void *)&NewBuffer, VTYPE_STRING, "NAttached", OPT_SINGLE );
  91.         strcpy( buffer, NewBuffer );
  92.         break;
  93.     }
  94.     HBBS_FlushConfig( CfgFile );
  95.   }
  96.   return( TRUE );
  97. }
  98.  
  99. int MAILSCAN_GetFirstMessage( int ConfNum )
  100. {
  101.   int n;
  102.   char *filename, *buffer;
  103.   struct Node *ConfPtr;
  104.  
  105.   filename = AllocVec( MAX_PATH_LENGTH, MEMF_CLEAR|MEMF_PUBLIC );
  106.   buffer = AllocVec( BUFFER_LENGTH, MEMF_CLEAR|MEMF_PUBLIC );
  107.  
  108.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  109.  
  110.   sprintf( filename, "%sMail/Mail.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath );
  111.  
  112.   if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_FirstMessage))
  113.   {
  114.     stripcr( buffer );
  115.     n = atoi( buffer );
  116.   }
  117.   else
  118.     n=0;
  119.  
  120.   FreeVec( filename );
  121.   FreeVec( buffer );
  122.  
  123.   return( n );
  124. }
  125.  
  126. int MAILSCAN_GetLastMessage( int ConfNum )
  127. {
  128.   int n;
  129.   char *filename, *buffer;
  130.   struct Node *ConfPtr;
  131.  
  132.   filename = AllocVec( MAX_PATH_LENGTH, MEMF_CLEAR|MEMF_PUBLIC );
  133.   buffer = AllocVec( BUFFER_LENGTH, MEMF_CLEAR|MEMF_PUBLIC );
  134.  
  135.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  136.  
  137.   sprintf( filename, "%sMail/MAIL.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath );
  138.  
  139.   if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_LastMessage))
  140.   {
  141.     stripcr( buffer );
  142.     n = atoi( buffer );
  143.   }
  144.   else
  145.     n=0;
  146.  
  147.   FreeVec( filename );
  148.   FreeVec( buffer );
  149.  
  150.   return( n );
  151. }
  152.  
  153.  
  154. // Note : This routine also checks to see if the message is only for the user.
  155. BOOL MAILSCAN_CheckMultiReaderMessage( V_BIGNUM UserID, char *UsersIDs )
  156. {
  157.   char str[BUFFER_LENGTH];
  158.   int  count, i, n;
  159.   V_BIGNUM CID;
  160.  
  161.   n = strlen( UsersIDs );
  162.  
  163.   for( count=0,i=0; count < n; count++,i++ )
  164.     if( UsersIDs[count] != ',' ) str[i] = UsersIDs[count];
  165.     else
  166.     {
  167.       str[i]=0;
  168.       CID = atol( str );
  169.       if( CID==UserID )  return( TRUE );
  170.       else i=-1;
  171.     }
  172.   str[i]=0;
  173.   CID = atol( str );
  174.   if( CID == UserID )  return( TRUE );
  175.  
  176.   return( FALSE );
  177. }
  178.  
  179. BOOL MAILSCAN_CreateList( V_STRINGLIST *TheList )
  180. {
  181.   if( *TheList = (struct List *)AllocVec( sizeof( struct List ), MEMF_CLEAR|MEMF_PUBLIC ))
  182.   {
  183.     NewList( *TheList );
  184.     return( TRUE );
  185.   }
  186.   return( FALSE );
  187. }
  188.  
  189. void MAILSCAN_NewListNode(struct List *NameVar , V_STRINGLIST list )
  190. {
  191.   struct Node *NewNode;
  192.  
  193.   if (NewNode=AllocVec(sizeof(struct Node),MEMF_PUBLIC))
  194.   {
  195.     NewNode->ln_Name = (char *)NameVar;
  196.     AddTail(list,NewNode);
  197.   }
  198. }
  199.  
  200. void MAILSCAN_FreeListList( V_STRINGLIST listlist )
  201. {
  202.   struct Node *node;
  203.  
  204.   while (listlist->lh_Head->ln_Succ)
  205.   {
  206.     node=listlist->lh_Head;
  207.     Remove(node);
  208.     FreeVec(node);
  209.   }
  210.   FreeVec( listlist );
  211. }
  212.  
  213. BOOL MAILSCAN_IsMessageForCurrentUser( char *filename )
  214. {
  215.   char buffer[BUFFER_LENGTH], buffer2[BUFFER_LENGTH];
  216.   BOOL           AddMessageToList;
  217.  
  218.   MessageBaseError=0;
  219.  
  220.   if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageFor ))
  221.   {
  222.     if( MAILSCAN_RequestStringFromFile( filename, buffer2, MailSys_OFFSET_MessageForIDs ))
  223.     {
  224.       AddMessageToList = FALSE;
  225.       stripcr( buffer );
  226.       if( !(stricmp( buffer, "EAll" )))
  227.       {
  228.         //Message is an 'EAll'
  229.         AddMessageToList = TRUE;
  230.       }
  231.       else
  232.       {
  233.         if( !(stricmp( buffer, "All" )))
  234.         {
  235.           //Message is an 'All'
  236.           AddMessageToList = TRUE;
  237.         }
  238.         else
  239.         {
  240.           if( MAILSCAN_CheckMultiReaderMessage( N_ND->User.CallData.UserID, buffer2 ))
  241.           {
  242.             //Message is a MultiReader® Message
  243.             AddMessageToList = TRUE;
  244.           }
  245. //        else
  246. //        {
  247. //          if( Don't know how to check for groups get!! )
  248. //          {
  249. //          }
  250. //          else
  251. //          {
  252. //            if( Check HERE to see if message is public. )
  253. //            {
  254. //            }
  255. //          }
  256. //        }
  257.         }
  258.       }
  259.     }
  260.   }
  261.   else MessageBaseError = MAILERROR_FileDoesNotExist;
  262.   if( AddMessageToList ) return( TRUE );
  263.   else return( FALSE );
  264. }
  265.  
  266. V_STRINGLIST MAILSCAN_PrepareConfMessageList( int confnum )
  267. {
  268.   char           filename[MAX_PATH_LENGTH], outstr[BUFFER_LENGTH];
  269.   V_STRINGLIST   ConfMessages=NULL;
  270.   int            CurrentMessage, LastMessage;
  271.   BOOL           AtLeastOne;
  272.   struct Node   *ConfPtr;
  273.   BPTR           lock;
  274.  
  275.   ConfPtr = GetNode( BBSGlobal->ConfList, confnum-1 );
  276.  
  277.   AtLeastOne = FALSE;
  278.   ConfMessages = NULL;
  279.  
  280.   if( MAILSCAN_CreateList( &ConfMessages ) )
  281.   {
  282.  
  283.     if( MAILSCAN_CheckConfIsValid( confnum ) )
  284.     {
  285.       CurrentMessage = MAILSCAN_GetFirstMessage( confnum );
  286.       LastMessage = MAILSCAN_GetLastMessage( confnum );
  287.  
  288.       if( LastMessage != 0 )
  289.       {
  290.         while( CurrentMessage <= LastMessage )
  291.         {
  292.           sprintf( filename, "%sMail/Messages/%d.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, CurrentMessage );
  293.  
  294.           if( lock = Lock( filename, SHARED_LOCK ))
  295.           {
  296.             UnLock( lock );
  297.             if( MAILSCAN_IsMessageForCurrentUser( filename ) )
  298.             {
  299.               AtLeastOne = TRUE;
  300.               sprintf( outstr, "%d", CurrentMessage );
  301.               NewStrNode( outstr, ConfMessages );
  302.             }
  303. /*C*/     }
  304.           CurrentMessage++;
  305.         }
  306.       }
  307.       if( AtLeastOne == FALSE )
  308.         NewStrNode( "0", ConfMessages );
  309.     }
  310.     else
  311.       NewStrNode( "-1", ConfMessages );
  312.   }
  313.  
  314.   return( ConfMessages );
  315. }
  316.  
  317. V_STRINGLIST MAILSCAN_PrepareMessageList( void )
  318. {
  319.   V_STRINGLIST   Messages=NULL;
  320.   V_STRINGLIST   ConfMessages=NULL;
  321.   int            loop;
  322.  
  323.   if( MAILSCAN_CreateList( &Messages ) )
  324.   {
  325.     for( loop=1; loop <= BBSGlobal->Conferences ; loop++ )
  326.     {
  327.       ConfMessages = MAILSCAN_PrepareConfMessageList( loop );
  328.  
  329.       MAILSCAN_NewListNode( ConfMessages , Messages );
  330.     }
  331.   }
  332.   return( Messages );
  333. }
  334.  
  335. struct MAIL_Message *MAILSCAN_CreateMailMsgStruct( int ConfNum, char *MessageNumber )
  336. {
  337.   char buffer[BUFFER_LENGTH], filename[MAX_PATH_LENGTH];
  338.   struct MAIL_Message *NewMsg = NULL;
  339.   struct Node *ConfPtr;
  340.   BPTR lock;
  341.  
  342.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  343.  
  344.   sprintf( filename, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageNumber );
  345.  
  346.   if( lock = Lock( filename, SHARED_LOCK ))
  347.   {
  348.     UnLock( lock );
  349.     if( NewMsg = AllocVec( sizeof( struct MAIL_Message ), MEMF_PUBLIC|MEMF_CLEAR ))
  350.     {
  351.  
  352.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageFrom ))
  353.       {
  354.         stripcr( buffer );
  355.         strcpy( NewMsg->MM_From, buffer );
  356.       }
  357.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageFor ))
  358.       {
  359.         stripcr( buffer );
  360.         strcpy( NewMsg->MM_For, buffer );
  361.       }
  362.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageSubject ))
  363.       {
  364.         stripcr( buffer );
  365.         strcpy( NewMsg->MM_Subject, buffer );
  366.       }
  367.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageRead ))
  368.       {
  369.         stripcr( buffer );
  370.         NewMsg->MM_Read = atoi( buffer );
  371.       }
  372.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageFilesDL ))
  373.       {
  374.         stripcr( buffer );
  375.         NewMsg->MM_FilesDL = atoi( buffer );
  376.       }
  377.       if( MAILSCAN_RequestStringFromFile( filename, buffer, MailSys_OFFSET_MessageNAttachedFiles ))
  378.       {
  379.         stripcr( buffer );
  380.         NewMsg->MM_NAttachedFiles = atoi( buffer );
  381.       }
  382.     }
  383.   }
  384.   else
  385.   {
  386.     return( NULL );
  387.   }
  388.   return( NewMsg );
  389. }
  390.  
  391. void MAILSCAN_DisplayFullBackLine( char *AnsiBack )
  392. {
  393.   char outstr[BUFFER_LENGTH];
  394.  
  395.   sprintf( outstr, "%s                                                                                \r\n"ANSI_BG_BLACK, AnsiBack );
  396.   DOOR_WriteText( outstr );
  397. }
  398.  
  399. BOOL MAILSCAN_ShowMessagesAvailableToUser( struct Node *MessListPtr, int ConfNum )
  400. {
  401.   struct Node *ptr2;
  402.   char outstr[BUFFER_LENGTH];
  403.   int n;
  404.  
  405.   struct MAIL_Message *Mess;
  406.  
  407.   if( !( stricmp( ((struct List *)MessListPtr->ln_Name)->lh_Head->ln_Name, "0" )))
  408.   {
  409.     sprintf( outstr, "  "ANSI_FG_CYAN"No messages for you in this conference.\r\n" );
  410.     DOOR_WriteText( outstr );
  411.     return( FALSE );
  412.   }
  413.   else
  414.   {
  415.     DOOR_WriteText( "   "ANSI_FG_YELLOW"#    "ANSI_FG_CYAN"Read#   "ANSI_FG_GREEN"From                 "ANSI_FG_PURPLE"Subject"ANSI_FG_WHITE"\r\n" );
  416.     DOOR_WriteText( ANSI_FG_WHITE" ----- ------- -------------------- ------------------------------------------- \r\n" );
  417.  
  418.     for( ptr2 = ((struct List *)MessListPtr->ln_Name)->lh_Head; ptr2->ln_Succ; ptr2 = ptr2->ln_Succ )
  419.     {
  420.       n = atoi( ptr2->ln_Name );
  421.       if( Mess = MAILSCAN_CreateMailMsgStruct( ConfNum, ptr2->ln_Name ))
  422.       {
  423.         sprintf( outstr, ANSI_FG_WHITE"|"ANSI_FG_YELLOW"%05d"ANSI_FG_WHITE"|"ANSI_FG_CYAN"%7d"ANSI_FG_WHITE"|"ANSI_FG_GREEN"%-20s"ANSI_FG_WHITE"|"ANSI_FG_PURPLE"%-43s"ANSI_FG_WHITE"|\r\n", n, Mess->MM_Read, Mess->MM_From, Mess->MM_Subject );
  424.         DOOR_WriteText( outstr );
  425.         FreeVec( Mess );
  426.       }
  427.     }
  428.     DOOR_WriteText( ANSI_FG_WHITE" ----- ------- -------------------- ------------------------------------------- \r\n" );
  429.   }
  430.   return( TRUE );
  431. }
  432.  
  433. void MYDOOR_DoMailScan( int argc, char *argv[] )
  434. {
  435.   V_STRINGLIST Messages = NULL;
  436.   struct Node *ptr1, *ConfPtr;
  437.   int confnum=0;
  438.   char outstr[BUFFER_LENGTH];
  439.   BOOL DoAgain,Done=FALSE;
  440.  
  441.   MYDOOR_DisplayTecLisMailHeader();
  442.  
  443.   if( Messages = MAILSCAN_PrepareMessageList() )
  444.   {
  445.     for( ptr1 = Messages->lh_Head, (ConfPtr = BBSGlobal->ConfList->lh_Head) ; (ptr1->ln_Succ) && (N_ND->OnlineStatus==OS_ONLINE) && !Done; ptr1 = ptr1->ln_Succ, ConfPtr = ConfPtr->ln_Succ )
  446.     {
  447.       confnum++;
  448.  
  449.       if( stricmp( ((struct List *)ptr1->ln_Name)->lh_Head->ln_Name, "-1" ))
  450.       {
  451.         sprintf( outstr, ANSI_FG_PURPLE"Messages for you in %s"ANSI_FG_WHITE"\r\n", ConfPtr->ln_Name );
  452.         DOOR_WriteText( outstr );
  453.  
  454.         if( (MAILSCAN_ShowMessagesAvailableToUser( ptr1 , confnum )) )
  455.         {
  456.           sprintf( outstr, "\r\n"ANSI_FG_GREEN"Options :- "ANSI_FG_YELLOW"(N Q "ANSI_FG_WHITE"Y"ANSI_FG_YELLOW" Z ?)"ANSI_FG_WHITE" :");
  457.           DoAgain = TRUE;
  458.           while( DoAgain )
  459.           {
  460.             DOOR_WriteText( outstr );
  461.             DOOR_GetLine( TRUE, TRUE, 0 );
  462.             if( N_ND->OnlineStatus==OS_ONLINE )
  463.             {
  464.               if( !(stricmp( N_ND->CurrentLine, "Z" )))
  465.               {
  466.                 DOOR_WriteText( "        --  Zoom Door Requested!\r\n" );
  467.               }
  468.               else
  469.               {
  470.                 if( !(stricmp( N_ND->CurrentLine, "?" )))
  471.                 {
  472.                   DOOR_WriteText( "\r\n" );
  473.                   DOOR_WriteText( "Y, <CR> - Read Messages\r\n" );
  474.                   DOOR_WriteText( "N       - Don't Read Messages\r\n" );
  475.                   DOOR_WriteText( "Z       - Launch Zoom Door\r\n" );
  476.                   DOOR_WriteText( "?       - Display Help\r\n" );
  477.                   DOOR_WriteText( "Q       - Quit To MainScan\r\n" );
  478.                   DOOR_WriteText( "\r\n" );
  479.  
  480.                 }
  481.                 else
  482.                 {
  483.                   if( (!(N_ND->CurrentLine[0]) || (!(stricmp( N_ND->CurrentLine, "Y" )))))
  484.                   {
  485.                     MAILREAD_ReadMessages( (struct List *)ptr1->ln_Name, confnum );
  486.                     DoAgain = FALSE;
  487.                   }
  488.                   else
  489.                   {
  490.                     if( !(stricmp( N_ND->CurrentLine, "N" )))
  491.                     {
  492.                       sprintf( outstr, "%s                                                                \r\n%s", ANSI_UP, ANSI_UP );
  493.                       DOOR_WriteText( outstr );
  494.                       DoAgain = FALSE;
  495.                     }
  496.                     else
  497.                     {
  498.                       if( !(stricmp( N_ND->CurrentLine, "Q" )))
  499.                       {
  500.                         DoAgain=FALSE;
  501.                         Done=TRUE;
  502.                       }
  503.                       else
  504.                       {
  505.                         DOOR_WriteText(ANSI_FG_RED"INVALID RESPONCE!"ANSI_FG_WHITE);
  506.                       }
  507.                     }
  508.                   }
  509.                 }
  510.               }
  511.             }
  512.             else
  513.             {
  514.               DoAgain = FALSE;
  515.               Done = TRUE;
  516.             }
  517.           }
  518.         }
  519. //      else
  520. //      {
  521. //        MAILSCAN_DisplayFullBackLine( ANSI_BG_BLUE );
  522. //      }
  523.       }
  524.     }
  525.     DOOR_WriteText( "\r\n" );
  526.  
  527.     for( ptr1 = Messages->lh_Head; ptr1->ln_Succ; ptr1 = ptr1->ln_Succ )
  528.       FreeStrList( (struct List *)ptr1->ln_Name );
  529.     MAILSCAN_FreeListList( Messages );
  530.   }
  531.   else
  532.   {
  533.     DOOR_WriteText( "Problems with Message Base!\r\n" );
  534.   }
  535. }
  536.